<?php
// +----------------------------------------------------------------------
// | RXThinkCMF敏捷开发框架 [ 赋能开发者，助力企业发展 ]
// +----------------------------------------------------------------------
// | 版权所有 2018~2023 南京RXThinkCMF研发中心
// +----------------------------------------------------------------------
// | Licensed LGPL-3.0 RXThinkCMF并不是自由软件，未经许可禁止去掉相关版权
// +----------------------------------------------------------------------
// | 官方网站: https://www.rxthink.cn
// +----------------------------------------------------------------------
// | Author: @牧羊人 团队荣誉出品
// +----------------------------------------------------------------------
// | 版权和免责声明:
// | 本团队对该软件框架产品拥有知识产权（包括但不限于商标权、专利权、著作权、商业秘密等）
// | 均受到相关法律法规的保护，任何个人、组织和单位不得在未经本团队书面授权的情况下对所授权
// | 软件框架产品本身申请相关的知识产权，禁止用于任何违法、侵害他人合法权益等恶意的行为，禁
// | 止用于任何违反我国法律法规的一切项目研发，任何个人、组织和单位用于项目研发而产生的任何
// | 意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失 (包括但不限于直接、间接、
// | 附带或衍生的损失等)，本团队不承担任何法律责任，本软件框架禁止任何单位和个人、组织用于
// | 任何违法、侵害他人合法利益等恶意的行为，如有发现违规、违法的犯罪行为，本团队将无条件配
// | 合公安机关调查取证同时保留一切以法律手段起诉的权利，本软件框架只能用于公司和个人内部的
// | 法律所允许的合法合规的软件产品研发，详细声明内容请阅读《框架免责声明》附件；
// +----------------------------------------------------------------------

namespace app\admin\service;

use app\admin\model\ActionLog;
use app\admin\model\Member;
use app\admin\model\User;
use AlibabaCloud\Client\AlibabaCloud;
use AlibabaCloud\Client\Exception\ClientException;
use AlibabaCloud\Client\Exception\ServerException;
use app\admin\model\ConfigData;
use think\Db;
/**
 * 系统登录-服务类
 * @author 牧羊人
 * @since 2020/11/19
 * Class LoginService
 * @package app\admin\service
 */
class LoginService extends BaseService
{
    /**
     * 构造函数
     * @author 牧羊人
     * @since 2020/11/19
     * LoginService constructor.
     */
    public function __construct()
    {
        $this->model = new User();
    }

    /**
     * 阿里云发送短信
     * @return void
     */
    public function get_code()
    {

        // 请求参数
        $param = request()->param();
        // 登录账号
        $username = trim($param['username']);
        if (!$username) {
            return message('手机号不能为空', false);
        }

        // 用户验证
        $info = $this->model->getOne([
            ['mobile', '=', $username],
        ]);
        if (!$info) {
            return message('手机号不存在', false);
        }
        $time5 = time() - 300;
        //查询此手机号最后一次发送短信时间
        $last_sms = Db::table('think_sms')->where('mobile',$username)->where('create_time','>',$time5)->count();
        if($last_sms){
            return message('请勿频繁发送', false);
        }
        $code = mt_rand(100000,999999);

        $phoneNumber = $username;
        $accessKeyId = ConfigData::where('code','accessKeyId')->value('value');
        $accessSecret = ConfigData::where('code','accessKeySecret')->value('value');
        $signName = ConfigData::where('code','signName')->value('value');//配置签名
        $templateCode = ConfigData::where('code','templateCode')->value('value');;//配置短信模板编号
        //TODO 随机生成一个6位数
        $authCodeMT = $code;
        //TODO 短信模板变量替换JSON串,友情提示:如果JSON中需要带换行符,请参照标准的JSON协议。
        $jsonTemplateParam = json_encode(['code' => $authCodeMT], 320);
        /**
         * 需要注意以下几点：
         * regionId必须为：cn-hangzhou，请勿修改。
         * product必须为：Dysmsapi，请勿修改。
         * host必须为：dysmsapi.aliyuncs.com，请勿修改。
         * version必须为：2017-05-25，请勿修改。
         */
        AlibabaCloud::accessKeyClient($accessKeyId, $accessSecret)
            ->regionId('cn-hangzhou')//杭州接入点：cn-hangzhou
            ->asDefaultClient();

        try {
            // 访问产品 APIs，OpenAPI采用RPC签名风格
            $result = AlibabaCloud::rpc()
                ->product('Dysmsapi')
//                ->scheme('https') // https | http
                ->version('2017-05-25')
                ->action('SendSms')//批量发送短信：SendBatchSms
                ->method('POST')
                ->host('dysmsapi.aliyuncs.com')
                ->options([
                    'query' => [
                        'RegionId' => 'cn-hangzhou',//杭州接入点：cn-hangzhou
                        'PhoneNumbers' => $phoneNumber,//目标手机号
                        'SignName' => $signName,
                        'TemplateCode' => $templateCode,
                        'TemplateParam' => $jsonTemplateParam,
                    ],
                ])
                ->request();
            $opRes = $result->toArray();
            //print_r($opRes);
            if ($opRes && $opRes['Code'] == "OK") {
                //进行Cookie保存
//                cookie('authCodeMT' . $phoneNumber, $authCodeMT, 300);
                $insert = [
                    'code'=>$code,
                    'mobile'=>$username,
                    'end_time'=>time()+300,
                    'create_time'=>time()
                ];
                Db::table('think_sms')->insert($insert);
//                return message("发送成功", true, $opRes);

            }
        } catch (ClientException $e) {
            return message($e->getErrorMessage() . PHP_EOL, false);
        } catch (ServerException $e) {
            return message($e->getErrorMessage() . PHP_EOL, false);
        }
        return message("发送成功", true);
    }

    /**
     * 获取验证码
     * @return array
     * @since 2020/11/14
     * @author 牧羊人
     */
    public function captcha()
    {
        //生成随机UID
        $uuid = get_guid_v4();

        //生成图片验证码
        $verify = new \Verify(['length' => 4, 'useCurve' => true]);
        // 验证码图片
        $img = $verify->entry($uuid);
        // 验证码值
        $code = $verify->getCode();

        // 把内容存入 cache，10分钟后过期
        $key = get_guid_v4();
        $this->model->setCache($key, $code, 10 * 60);

        // 返回结果
        $result = [
            'key' => $key,
            'captcha' => "data:image/png;base64," . base64_encode($img)
        ];
        return message("操作成功", true, $result);
    }

    /**
     * 登录系统
     * @return mixed
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     * @author 牧羊人
     * @since 2020/11/19
     */
    public function login()
    {
        // 请求参数
        $param = request()->param();
        // 登录账号
        $username = trim($param['username']);
        if (!$username) {
            return message('登录账号不能为空', false);
        }
        // 登录密码
        $password = trim($param['password']);
        if (!$password) {
            return message('登录密码不能为空', false);
        }
        if (strlen($password) < 32) {
            $password = md5(md5($password . $username));
        }
//        // 验证码校验
//        $key = trim($param['key']);
//        // 验证码
//        $captcha = trim($param['captcha']);
//        $code = $this->model->getCache($key);
//        if ($captcha != "520" && strtolower($captcha) != strtolower($code)) {
//            return message("请输入正确的验证码", false);
//        }

        // 用户验证
        $info = $this->model->getOne([
            ['username', '=', $username],
        ]);
//        if (!$info) {
//            return message('登录账号不存在', false);
//        }
        // 密码校验
        //$password = get_password($password . $username);
        if (!$info || $password != $info['password']) {
            return message("账号或密码不正确", false);
        }
        // 使用状态校验
        if ($info['status'] != 1) {
            return message("帐号已被禁用", false);
        }

        // 设置日志标题
        ActionLog::setTitle("登录系统");
        // 创建退出日志
        ActionLog::record();

        // JWT生成token
        $jwt = new \Jwt();
        $token = $jwt->getToken($info['id']);

        // 结果返回
        $result = [
            'access_token' => $token,
        ];
        return message('登录成功', true, $result);
    }

    /**
     * 手机号登录系统
     * @return mixed
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     * @author 牧羊人
     * @since 2020/11/19
     */
    public function mobile_login()
    {
        // 请求参数
        $param = request()->param();
        // 登录账号
        $username = trim($param['username']);
        if (!$username) {
            return message('手机号不能为空', false);
        }
        // 登录密码
        $code = trim($param['code']);
        if (!$code) {
            return message('验证码不能为空', false);
        }


        // 用户验证
        $info = $this->model->getOne([
            ['mobile', '=', $username],
        ]);
        if (!$info) {
            return message('手机号不存在', false);
        }
        // 验证码校验
        $time5 = time() - 300;
        $is_code = Db::table('think_sms')->where('mobile',$username)->where('create_time','>',$time5)->where('code',$code)->count();
        if (!$is_code) {
            return message("验证码错误", false);
        }
        // 使用状态校验
        if ($info['status'] != 1) {
            return message("帐号已被禁用", false);
        }

        // 设置日志标题
        ActionLog::setTitle("登录系统");
        // 创建退出日志
        ActionLog::record();

        // JWT生成token
        $jwt = new \Jwt();
        $token = $jwt->getToken($info['id']);

        // 结果返回
        $result = [
            'access_token' => $token,
        ];
        return message('登录成功', true, $result);
    }

    /**
     * 学生登录
     */
    public function student_login($post)
    {
        //think_user username
        $map = [
            'roll' => $post['roll'],
            'realname' => $post['realname'],
            'mark' => 1,
        ];
        $res = Member::where($map)->cache(true,600)->find();
        if(empty($res)){
            return message("用户不存在", false);
        }
        //print_R($res);
        $map = [
            'username' => $post['roll'],
            //'realname' => $post['realname']
            'mark' => 1,
        ];
        $info = User::where($map)->cache(true,600)->find();
        //直接登录成功
        if(empty($info)){
            $users = new UserService();

            $passwrod = greatPass($post['realname'],$post['roll']);
            $post = [
                'user_type' => '2',
                'realname' => $post['realname'],
                'nickname' => $post['realname'],
                'username' => $post['roll'],
                'gender' => $res['gender'],
                'mobile' => $res['mobile'],
                'schoolId' => $res['organization'],
                'status' => 1,
                //'password' => get_password("123456" . $post['roll']),
                'password' => get_password($passwrod. $post['roll']),
                'login_time'=> time(),
                'update_time' => time(),
                'create_time' => time(),
                'mark' => 1,
            ];
            $userModel = new User();
            $info['id'] = $userModel->insertGetId($post);

            //$users->edit2();
        }
        // JWT生成token
        $jwt = new \Jwt();
        $token = $jwt->getToken($info['id']);

        // 结果返回
        $result = [
            'access_token' => $token,
        ];
        return message('登录成功', true, $result);
    }

    public function student_login2($post)
    {
        $post['roll'] = $post['username'];
        $map = [
            'username' => $post['roll'],
            'mark' => 1,
            //'realname' => $post['realname']
        ];
        $info = User::where($map)->find();
        //think_user username
        $map = [
            'roll' => $post['roll'],
            //'realname' => $post['realname']
            'mark' => 1,
        ];
        $res = Member::where($map)->find();
        if(empty($res)){
            $map = [
                'username' => $post['roll'],
                'mark' => 1,
                //'realname' => $post['realname']
            ];
            $res = Member::where($map)->find();
            if(empty($res)){
                return message("用户不存在", false);
            }
        }
        $defPwd = md5(md5(greatPass($res['realname'],$post['roll']) . $post['roll']));
		
        //直接登录成功
        if(empty($info)){
			if($defPwd != $post['password']){
				 return message("登录账号或登录密码不正确", false);
			}
            $post = [
                'user_type' => '2',
                'realname' => $res['realname'],
                'nickname' => $res['realname'],
                'username' => $post['roll'],
                'gender' => $res['gender'],
                'mobile' => $res['mobile'],
                'schoolId' => $res['organization'],
                'status' => 1,
                //'password' => get_password("123456" . $post['roll']),
                //'password' => get_password($passwrod . $post['roll']),
                'password' => $defPwd,
                'login_time'=> time(),
                'update_time' => time(),
                'create_time' => time(),
                'mark' => 1,
            ];

            $userModel = new User();
            $info['id'] = $userModel->insertGetId($post);
            $role = [
                'user_id' => $info['id'],
                'role_id' => 10,
            ];
            Db::table('think_user_role')->insert($role);
            //$users->edit2();
        }
        if ($defPwd != $post['password']) {
            // 用户验证
            $info = $this->model->getOne([
                ['username', '=', $post['roll']],
            ]);
//            if (!$info) {
//                return message('登录账号不存在', false);
//            }
            // 密码校验
            //$password = get_password($post['password'] . $post['roll']);
            $varPassword = $res['password'] ?: $info['password'];
//            var_dump('input =>' . $post['password']);
//            var_dump('member =>' . $res['password']);
//            var_dump('user =>' . $info['password']);
//            var_dump('$varPassword =>' . $varPassword);
            if (!$info || $post['password'] != $varPassword) {
                return message("登录账号或登录密码不正确", false);
            }
            // 使用状态校验
            if ($info['status'] != 1) {
                return message("帐号已被禁用", false);
            }
        }
        $row = Db::table('think_user_role')->where('user_id',$info['id'])->find();
        if(!$row){
            $role = [
                'user_id' => $info['id'],
                'role_id' => 10,
            ];
            Db::table('think_user_role')->insert($role);
        }
        // JWT生成token
        $jwt = new \Jwt();
        $token = $jwt->getToken($info['id']);
        // 结果返回
        $result = [
            'access_token' => $token,
        ];
        return message('登录成功', true, $result);
    }

    /**
     * 注销系统
     * @return array
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     * @author 牧羊人
     * @since 2020/11/20
     */
    public function logout()
    {
        // 记录退出日志
        ActionLog::setTitle("注销系统");
        // 创建退出日志
        ActionLog::record();
        return message();
    }

}